package com.size.mall.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
// @EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport {


    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }

    // @Bean
    // public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
    //
    //     RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig();
    //     config = config.entryTtl(Duration.ofMinutes(60 * 60 * 24 * 4));
    //
    //     // 设置一个初始化的缓存空间set集合
    //     Set<String> cacheNames = new HashSet<>();
    //     cacheNames.add("order_pay");
    //
    //     // 对每个缓存空间应用不同的配置
    //     Map<String, RedisCacheConfiguration> configMap = new HashMap<>();
    //     configMap.put("order_pay", config.entryTtl(Duration.ofSeconds(60 * 60 * 24 * 4)));
    //     RedisCacheManager cacheManager = RedisCacheManager.builder(redisConnectionFactory)
    //                                                       .initialCacheNames(cacheNames)
    //                                                       .withInitialCacheConfigurations(configMap)
    //                                                       .build();
    //     return cacheManager;
    // }

}